#include "server.h"

server::server(string ip,int port)
{
    server_ip=ip;
    server_port=port;
}

server::~server()
{
    for(auto i:sock_addr)
        close(i);
    close(sock_fd);
}

void server::run()
{
    sock_fd=socket(AF_INET,SOCK_STREAM,0);

    sockaddr_in server_addr;
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(server_port);
    server_addr.sin_addr.s_addr=inet_addr(server_ip.c_str());//c_str就是string类中的一个成员，将string转化为char
    if(bind(sock_fd,(sockaddr *)&server_addr,sizeof(server_addr))==-1)
    {
        perror("bind err");
        exit(1);
    }

    if(listen(sock_fd,128)==-1)
    {
        perror("listen err");
        exit(1);
    }

    sockaddr_in client_addr;
    socklen_t client_len;
    while(1)
    {   int conn=accept(sock_fd,(sockaddr *)&client_addr,&client_len);
        if(conn==-1)
        {
            perror("accept err");
            exit(1);
        }
        cout<<"文件描述符为"<<conn<<"的客户端成功连接\n";
        sock_addr.push_back(conn);
        thread t(server::Mes,conn);
        t.detach();
    }
}

void server::Mes(int conn)
{
    const int bufLen = 1024;
    char buf[bufLen];
    cout << sizeof(buf);
    while(1)
    {
        memset(buf, 0, bufLen);
        int len=recv(conn, buf, bufLen, 0);
        if(strcmp(buf,"exit")==0 || len<=0)
            break;
        cout << "收到套接字描述符为"<<conn<<"发来的信息："<<buf<<endl;
        len=send(conn, buf, strlen(buf), 0);
    }
}

// void server::Mes(int conn){
//     //接收缓冲区
//     char buffer[1000];
//     //不断接收数据
//     while(1)
//     {
//         memset(buffer,0,sizeof(buffer));
//         int len = recv(conn, buffer, sizeof(buffer),0);
//         //客户端发送exit或者异常结束时，退出
//         if(strcmp(buffer,"exit")==0 || len<=0)
//             break;
//         cout<<"收到套接字描述符为"<<conn<<"发来的信息："<<buffer<<endl;
//         len=send(conn,buffer,sizeof(buffer),0);
//     }
// }